package user.post.comment;

import java.io.Serializable;
import java.util.List;

import exceptions.comment.NonExistentCommentException;

import ids.IDsManager;
import ids.Identificable;

/**
 * Essa classe implementa um comentario e subcomentaro. tem como atributos um
 * autor, um texto e uma identificacao. Alem disso possui subcomentarios.
 * 
 * @author Heitor Meira
 * 
 */
public class Comment implements Identificable, Serializable{
	
	private static final long serialVersionUID = -3054466049739343321L;
	private String commentId;
	private String author;
	private String text;
	private CommentManager commentManager;

	/**
	 * O constutor de um {@code Comment} recebe atributos essenciais a criacao
	 * de um comentario, que sao um texto e o author do texto. Alem disso gera
	 * uma identificacao valida, alem de instancia um gerenciador de
	 * subcomentarios.
	 * 
	 * @param text
	 *            O texto desse comentario.
	 * @param author
	 *            O autor do comentario.
	 */
	public Comment(String text, String author) {
		setAuthor(author);
		setText(text);
		
		this.commentId = getValidId();
		
		commentManager = new CommentManager();
	}

	/**
	 * Atualiza o autor desse comentario, o autor default eh o recebido no
	 * contrutor.
	 * 
	 * @param author
	 *            O novo autor do comentario.
	 */
	public void setAuthor(String author) {
		this.author = author;
	}
	
	/**
	 * Fornece o autor desse comentario.
	 * 
	 * @return O autor desse comentario.
	 */
	public String getAuthor() {
		return author;
	}

	/**
	 * Atualiza o texto desse comentario, o texto default eh o recebido no
	 * construtor.
	 * 
	 * @param text
	 *            O novo texto desse comentario.
	 */
	public void setText(String text) {
		this.text = text;
	}
	
	/**
	 * Fornece o texto desse comentario.
	 * 
	 * @return O texto desse comentario.
	 */
	public String getText() {
		return text;
	}

	/**
	 * Fornece a identificacao desse comentario.
	 * 
	 * @return A identificacao desse comentario.
	 */
	@Override
	public String getId() {
		return commentId;
	}

	/**
	 * Adiciona um sub comentario a um subcomentario desse comentario.
	 * 
	 * @param author
	 *            O autor do subcomentario.
	 * @param text
	 *            O texto do subcomentario.
	 * @param commentId
	 *            A identificacao do subcomentario que se quer adicionar um
	 *            subcomentario.
	 * @return A idetnificacao do subcomentario adicionado.
	 * @throws NonExistentCommentException
	 *             Se nenhum subcomentario for encontrado com a identificacao
	 *             fornecida.
	 */
	String addSubComment(String author, String text, String commentId) throws NonExistentCommentException {
		return commentManager.addSubComment(author, text, commentId);
	}

	/**
	 * Fornece uma lista com todos os subcomentarios imediatos desse
	 * comentario.
	 * 
	 * @return Uma lista de subcomentarios.
	 */
	public List<Comment> getComments() {
		return commentManager.getComments();
	}
	
	/**
	 * Adiciona um comentario a esse comentario, ou seja um subcomentario
	 * imediato.
	 * 
	 * @param author
	 *            O autor do subcomentario a ser adicionado.
	 * @param text
	 *            O texte do subcomentario a ser adcionado.
	 * @return A identificacao do subcomentario adicionado.
	 */
	String addComment(String author, String text) {
		return commentManager.addComment(author, text);
	}
	
	/**
	 * Gera um idetificacao valida para esse comentario.
	 * 
	 * @return Uma identificacao valida para esse comentario.
	 */
	private String getValidId() {
		return IDsManager.getInstance().getAvaibleCommentId();
	}
}
